﻿// ------------------------------------------------------------------------
// 项目名称：Canroc.Net 
// 版权归属：Canroc（https://gitee.com/canroc）
//
// 许可证信息
// Canroc.Net项目主要遵循 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-APACHE 文件。
//
// 使用条款：
// 1.使用本项目应遵守相关法律法规和许可证的要求。
// 2.不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动。
// 3.任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任
//
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
//
// 其他重要信息
// Canroc.Net 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// ------------------------------------------------------------------------

using Canroc.Net.Application.SysFileService;
using Canroc.Net.Application.SysTemplateService.Dto;
using System.Net.Mime;

// ReSharper disable once CheckNamespace
namespace Canroc.Net.Application.SysTemplateService;

/// <summary>
///     系统模板应用服务
/// </summary>
[ApiDescriptionSettings("System")]
public partial class SysTemplateAppService(
    SqlSugarRepository<SysTemplate> templateRep,
    IServiceProvider serviceProvider) : IDynamicApiController, ITransient
{
    /// <summary>
    ///     添加系统模板
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> AdditionAsync(TemplateInput data)
    {
        // 编码验证
        var isExist = await ExistAsync(data.Name, data.Code);
        if (isExist)
            throw Oops.Oh(ErrorCodeEnum.RepeatFile);

        var entity = data.Adapt<SysTemplate>();
        return await templateRep.InsertAsync(entity);
    }

    /// <summary>
    ///     编辑系统模板
    /// </summary>
    /// <param name="data">表单数据</param>
    /// <returns></returns>
    public async Task<bool> EditAsync(TemplateInput data)
    {
        var entity = await templateRep.GetByIdAsync(data.Id);
        // 更新数据
        data.Adapt(entity);
        return await templateRep.UpdateAsync(entity);
    }

    /// <summary>
    ///     编辑系统模板状态
    /// </summary>
    /// <param name="data">请求模板</param>
    /// <returns></returns>
    public async Task<bool> EnableAsync(InputModel data)
    {
        return await templateRep.UpdateAsync(
            t => new SysTemplate { IsEnable = SqlFunc.IIF(t.IsEnable, false, true) }, t => t.Id == data.Id);
    }

    /// <summary>
    ///     删除系统模板
    /// </summary>
    /// <param name="data">请求模板</param>
    /// <returns></returns>
    public async Task<bool> DelAsync(DeleteInputModel data)
    {
        return await templateRep.UpdateAsync(t => new SysTemplate { IsDelete = true },
            t => data.Ids.Contains(t.Id));
    }

    /// <summary>
    ///     获取系统模板
    /// </summary>
    /// <param name="id">主键</param>
    /// <returns></returns>
    public async Task<TemplateOutput?> GetDataAsync(Guid id)
    {
        return await templateRep.AsQueryable().Where(t => t.Id == id).Select<TemplateOutput>().FirstAsync();
    }

    /// <summary>
    ///     分页: 系统模板集合
    /// </summary>
    /// <param name="query">查询模板</param>
    /// <returns></returns>
    public async Task<PageModel<TemplateOutput>> GetPageAsync([FromQuery] TemplatePageQuery query)
    {
        return await templateRep
            .AsQueryable()
            .LeftJoin<SysFile>((t, f) => t.FileId == f.Id)
            .WhereIF(!query.Name.IsNullOrEmpty(), t => t.Name.Contains(query.Name))
            .WhereIF(!query.Code.IsNullOrEmpty(), t => t.Code.Contains(query.Code))
            .WhereIF(query.IsEnable.HasValue, t => t.IsEnable == query.IsEnable)
            .Select(
                (t, f) => new TemplateOutput { Name = t.Name, FileName = f.Name, FileSize = f.Size, FilePath = f.Path },
                true)
            .OrderByPropertyName(query.OrderField, query.IsAscending ? OrderByType.Asc : OrderByType.Desc)
            .ToPageAsync(query.PageIndex, query.PageSize);
    }

    /// <summary>
    ///     下载系统模板
    /// </summary>
    /// <param name="code">主键</param>
    /// <returns></returns>
    [HttpGet]
    [NonUnify]
    [SuppressMonitor]
    public async Task<IActionResult> DownAsync(string code)
    {
        // 获取模板
        var template = await GetDataAsync(code);
        _ = template ?? throw Oops.Oh(ErrorCodeEnum.NotFindData);
        // 获取模板附件记录
        var sysFileAppService = serviceProvider.GetRequiredService<SysFileAppService>();
        var fileMessage = await sysFileAppService.GetDataAsync(template.FileId);
        _ = fileMessage ?? throw Oops.Oh(ErrorCodeEnum.NotFindFile);

        var buffer = await File.ReadAllBytesAsync(fileMessage.Path);

        // 返回文件流
        return new FileContentResult(buffer, MediaTypeNames.Application.Octet)
        {
            FileDownloadName = template.Name + fileMessage.Extend
        };
    }

    /// <summary>
    ///     编号是否已创建
    /// </summary>
    /// <param name="name">模板名称</param>
    /// <param name="code">模板编码</param>
    /// <returns></returns>
    [NonAction]
    private async Task<bool> ExistAsync(string name, string code)
    {
        return await templateRep.IsAnyAsync(t => (t.Name == name || t.Code == code) && !t.IsDelete);
    }

    /// <summary>
    ///     获取系统模板
    /// </summary>
    /// <param name="code">模板编码</param>
    /// <returns></returns>
    [NonAction]
    public async Task<TemplateOutput?> GetDataAsync(string code)
    {
        return await templateRep
            .AsQueryable()
            .LeftJoin<SysFile>((t, f) => t.FileId == f.Id)
            .Where((t, f) => t.Code == code && t.IsEnable)
            .Select(
                (t, f) => new TemplateOutput { Name = t.Name, FileName = f.Name, FileSize = f.Size, FilePath = f.Path },
                true)
            .FirstAsync();
    }
}